package com.br.fsm.projectdelivery.repositorio;

import java.util.ArrayList;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.util.Log;

import com.br.fsm.projectdelivery.activity.R;
import com.br.fsm.projectdelivery.basica.Pagamento;
import com.br.fsm.projectdelivery.basica.Pagamento.Pagamentos;
import com.br.fsm.projectdelivery.excecao.RepositorioException;
import com.br.fsm.projectdelivery.util.Constantes;

public class RepositorioPagamento extends RepositorioBasico implements IRepositorioPagamento {

	private static RepositorioPagamento instance;	
	
	public static final String TABLE_NAME = "PAGAMENTO";
	
	public static RepositorioPagamento getInstance(){
		if ( instance == null ){
			instance =  new RepositorioPagamento();
		} 
		return instance;
	}

	@Override
	public Pagamento getPagamentoById(int id) throws RepositorioException {
		Cursor cursor = null;
		
		Pagamento pagamento = null;
		
		try {
			cursor = db.query(TABLE_NAME, Pagamento.getColumns(), Pagamentos.ID + " = " + id , null,
					null, null, null, null);
			
			if (cursor.moveToFirst()) {
				
				pagamento = new Pagamento();
				
				int idxId = cursor.getColumnIndex(Pagamentos.ID);
				int idxbandeira = cursor.getColumnIndex(Pagamentos.BANDEIRA);
				int idxparcelas = cursor.getColumnIndex(Pagamentos.PARCELAS);
				int idxtipo = cursor.getColumnIndex(Pagamentos.TIPO);
				int idxnumeroCartao = cursor.getColumnIndex(Pagamentos.NUMEROCARTAO);
				int idxcodSeguranca = cursor.getColumnIndex(Pagamentos.CODSEGURANCA);
				int idxvalor = cursor.getColumnIndex(Pagamentos.VALOR);
				
				
				pagamento.setPagamentoId(cursor.getInt(idxId));
				pagamento.setBandeira(cursor.getInt(idxbandeira));
				pagamento.setTipo(cursor.getString(idxtipo));
				pagamento.setNumeroCartao(cursor.getString(idxnumeroCartao));
				pagamento.setCodSeguranca(cursor.getString(idxcodSeguranca));
				pagamento.setValor(cursor.getDouble(idxvalor));
				pagamento.setParcelas(cursor.getInt(idxparcelas));
				
				}
		} catch (Exception e) {
			e.printStackTrace();
			Log.e( Constantes.CATEGORIA , e.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		} finally {
			if (cursor != null) {
				cursor.close();
			}
		}
		return pagamento;
	}

	@Override
	public ArrayList<Pagamento> getAllPagamento() throws RepositorioException {
		Cursor cursor = null;
		
		ArrayList<Pagamento> pagamentos = null;
		try {
			pagamentos = new ArrayList<Pagamento>();
			cursor = db.query(TABLE_NAME, Pagamento.getColumns(), null , null,
					null, null, null, null);
			
			if (cursor.moveToFirst()) {
				
				int idxId = cursor.getColumnIndex(Pagamentos.ID);
				int idxbandeira = cursor.getColumnIndex(Pagamentos.BANDEIRA);
				int idxparcelas = cursor.getColumnIndex(Pagamentos.PARCELAS);
				int idxtipo = cursor.getColumnIndex(Pagamentos.TIPO);
				int idxnumeroCartao = cursor.getColumnIndex(Pagamentos.NUMEROCARTAO);
				int idxcodSeguranca = cursor.getColumnIndex(Pagamentos.CODSEGURANCA);
				int idxvalor = cursor.getColumnIndex(Pagamentos.VALOR);
									
				do {
					Pagamento pagamento = new Pagamento();
					
					pagamento.setPagamentoId(cursor.getInt(idxId));
					pagamento.setBandeira(cursor.getInt(idxbandeira));
					pagamento.setTipo(cursor.getString(idxtipo));
					pagamento.setNumeroCartao(cursor.getString(idxnumeroCartao));
					pagamento.setCodSeguranca(cursor.getString(idxcodSeguranca));
					pagamento.setValor(cursor.getDouble(idxvalor));
					pagamento.setParcelas(cursor.getInt(idxparcelas));
				
					pagamentos.add(pagamento);
				} while (cursor.moveToNext());
				
			}
		} catch (Exception e) {
			e.printStackTrace();			
			Log.e( Constantes.CATEGORIA, e.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		} finally {
			if (cursor != null) {
				cursor.close();
			}
		}
		return pagamentos;
	}

	@Override
	public void insertPagamento(Pagamento pagamento) throws RepositorioException {
		ContentValues values = new ContentValues();

		values.put(Pagamentos.BANDEIRA, pagamento.getBandeira());
		values.put(Pagamentos.PARCELAS, pagamento.getParcelas());
		values.put(Pagamentos.TIPO, pagamento.getTipo());
		values.put(Pagamentos.NUMEROCARTAO, pagamento.getNumeroCartao());
		values.put(Pagamentos.CODSEGURANCA, pagamento.getCodSeguranca());
		values.put(Pagamentos.VALOR, pagamento.getValor());
		
		
		try {
			db.insert(TABLE_NAME, "", values);
		} catch (SQLException sqe) {
			sqe.printStackTrace();
			Log.e( Constantes.CATEGORIA , sqe.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		}		
	}

	@Override
	public void updatePagamento(Pagamento pagamento) throws RepositorioException {
		ContentValues values = new ContentValues();

		values.put(Pagamentos.BANDEIRA, pagamento.getBandeira());
		values.put(Pagamentos.PARCELAS, pagamento.getParcelas());
		values.put(Pagamentos.TIPO, pagamento.getTipo());
		values.put(Pagamentos.NUMEROCARTAO, pagamento.getNumeroCartao());
		values.put(Pagamentos.CODSEGURANCA, pagamento.getCodSeguranca());
		values.put(Pagamentos.VALOR, pagamento.getValor());
		

		String _id = String.valueOf(pagamento.getPagamentoId());

		String where = Pagamentos.ID + "=?";
		String[] whereArgs = new String[] { _id };

		try {
			db.update(TABLE_NAME, values, where, whereArgs);
		} catch (SQLException sqe) {
			sqe.printStackTrace();
			Log.e( Constantes.CATEGORIA , sqe.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		}
	}

	@Override
	public void removePagamento(Pagamento pagamento) throws RepositorioException {
		String _id = String.valueOf(pagamento.getPagamentoId());

		String where = Pagamentos.ID + "=?";
		String[] whereArgs = new String[] { _id };

		try {
			db.delete( TABLE_NAME, where, whereArgs);
		} catch (SQLException sqe) {
			sqe.printStackTrace();
			Log.e( Constantes.CATEGORIA , sqe.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		}
	}
}
